#include <iostream>
#include <cstring>
#include <signal.h>
#include <unistd.h>

using namespace std;

volatile int flag = 0;

void handler(int signum)
{
    cout << "cat a signal: " << signum << endl;
    flag = 1;
}

int main()
{
    signal(2, handler);
    // 在优化条件下，flag 变量可能被编译器直接优化到 CPU 内的寄存器中
    while(!flag);
    
    cout << "process quit normal" << endl;

    return 0;
}


// // pending 位图，什么时候从1->0，执行信号捕捉方法之前，先清0，再调用
// void PrintPending()
// {
//     sigset_t set;
//     sigpending(&set);

//     for(int signo = 1; signo <= 31; signo++)
//     {
//         if(sigismember(&set, signo)) cout << "1";
//         else cout << "0";
//     }
//     cout << "\n";
// }

// void handler(int signo)
// {
//     cout << "catch a signo: " << signo << endl;
//     while(true)
//     {
//         PrintPending();
//         sleep(1);
//     }
// }

// int main()
// {
//     struct sigaction act, oact;
//     memset(&act, 0, sizeof(act));
//     memset(&oact, 0, sizeof(oact));

//     // sigemptyset(&act.sa_mask);
//     // sigaddset(&act.sa_mask, 1);
//     // sigaddset(&act.sa_mask, 3);
//     // sigaddset(&act.sa_mask, 4);
//     act.sa_handler = handler;   // SIG_IGN SIG_DFL

//     sigaction(2, &act, &oact);

//     while(true)
//     {
//         cout << "I am a process: " << getpid() << endl;
//         sleep(1);
//     }

//     return 0;
// }